package com.tdam2011.grupo04; 

import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;

import com.tdam2011.grupo04.entidades.Contacto;
import com.tdam2011.grupo04.entidades.EmailContacto;
import com.tdam2011.grupo04.entidades.ListaContactos;
import com.tdam2011.grupo04.web.TabContactoWeb;

import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.QuickContactBadge;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.AdapterView.OnItemClickListener;

public class Agenda extends MasterListActivity implements OnItemClickListener{

	private final int DIALOG_ORDENAR = 0;
	private final int DIALOG_CONTACTO = 1;
	private final int DIALOG_CONFIRMAR = 2;
		
	private ContactoAgendaAdapter adapter;
	private Contacto contactoSeleccionado;
	
	private int posTelSeleccionado= 0;
	private int posEmailSeleccionado= 0;
	
	private int ordenElegido;
	private boolean VER_TODOS;
	private boolean VER_TELEFONO;
	private boolean VER_EMAIL;
	private boolean VER_SMS_WEB;
	
	private String nombreUsuario= null;
	

	@Override
	protected void onCreate(Bundle savedInstanceState) {
	        super.onCreate(savedInstanceState);
	        setContentView(R.layout.agenda);
	        
	        adapter = new ContactoAgendaAdapter();
			setListAdapter(adapter);
	        
	        //Preparamos la lista de contactos
	        this.getListView().setOnItemClickListener(this);
	        this.getListView().setTextFilterEnabled(true);

	        //Información necesaria para agregar un usuario a un contacto
	        Bundle extras = getIntent().getExtras();
	        if(extras != null) nombreUsuario= extras.getString("nombreUsuario");
	}
	
	@Override
	protected void onResume(){
		super.onResume();
		
		/************** Obtengo las preferencias ********************/
        SharedPreferences app_preferences = getSharedPreferences("ordenContactos", MODE_PRIVATE); 
        String order= app_preferences.getString("ordenContactos", "DISPLAY_NAME ASC");
        
        SharedPreferences op_preferences = getSharedPreferences("opVisualizarContactos", MODE_PRIVATE);
        VER_TODOS= op_preferences.getBoolean("todos", true);
        VER_TELEFONO= op_preferences.getBoolean("telefono", false);
        VER_EMAIL= op_preferences.getBoolean("mail", false);
        VER_SMS_WEB= op_preferences.getBoolean("smsWeb", false);
        
        //Cargamos datos en la agenda de contactos
        cargarAgenda(order);
	}
	
	@Override
    public boolean onCreateOptionsMenu(Menu menu)
    {
		MenuInflater inflater = getMenuInflater();
	    inflater.inflate(R.menu.agenda_menu, menu);
	    return true;
    }
	
	public boolean onOptionsItemSelected(MenuItem item){
		if(item.getTitle().equals("Buscar"))
				this.onSearchRequested();
		if(item.getTitle().equals("Ordenar"))
			showDialog(DIALOG_ORDENAR);
		if(item.getTitle().equals("Configuracion")){
			Intent configIntent= new Intent(Agenda.this, Configuracion.class);
			startActivity(configIntent);
		}
    	super.onOptionsItemSelected(item);
    	return false;
    }
	
	private String getOrden(int ordenElegido){
		String order= "";
		
		if(ordenElegido == 0) order="DISPLAY_NAME ASC";
        else if(ordenElegido == 1) order= "DISPLAY_NAME DESC";
        else if(ordenElegido == 2) order= "STARRED DESC";
        else if(ordenElegido == 3) order= "LAST_TIME_CONTACTED DESC";
		
		return order;
	}
	
	@Override
	protected void publishFilterApplied() {
		super.publishFilterApplied();
		this.cargarAgenda(getOrden(ordenElegido));
	}
	
	private void cargarAgenda(String order){		
		adapter.clearList();

		ListaContactos contactos= new ListaContactos();
		
		for(Contacto contacto : contactos.getContactos(order, this)){
			if(VER_TODOS || (VER_TELEFONO && contacto.tieneTelefono()) || (VER_EMAIL && contacto.tieneMail()) || (VER_SMS_WEB && contacto.getUsuario() != null))
				if(contacto.getNombre() != null && (!contactFilterApplied || contacto.getNombre().toLowerCase().startsWith(contactFilter)))
					adapter.addContacto(contacto);
		}

		adapter.notifyDataSetChanged();
	}
		
	class ContactoAgendaAdapter extends BaseAdapter implements Filterable{
		private ArrayList<Contacto> contactos;
		private LayoutInflater inflater;
		private ContactFilter filter;

		public ContactoAgendaAdapter() {
			contactos = new ArrayList<Contacto>();
			inflater = LayoutInflater.from(Agenda.this);
		}

		public void addContacto(Contacto contacto) {
			if (contacto != null) 
				contactos.add(contacto);
		}
		
		public int getCount() {
			return contactos.size();
		}
		
		public Object getItem(int position) {
			return contactos.get(position);
		}

		public long getItemId(int position) {
			return position;
		}
		
		public void clearList(){
			contactos.clear();
		}

		class Holder {
			private TextView txt_contacto;
			private TextView txt_telefono;
			private TextView txt_correo;
			private QuickContactBadge imagen_contacto;
			private ImageView img_siguiente; 
		}

		public View getView(final int position, View convertView, ViewGroup arg2){
			Holder holder;
			if (convertView == null) {
				convertView = inflater.inflate(R.layout.agenda_contacto, null);
				holder = new Holder();
				holder.imagen_contacto = (QuickContactBadge) convertView
						.findViewById(R.id.imagen_contacto);
				holder.txt_contacto = (TextView) convertView
						.findViewById(R.id.txt_contacto);
				holder.txt_telefono = (TextView) convertView
						.findViewById(R.id.txt_telefono);
				holder.txt_correo = (TextView) convertView
						.findViewById(R.id.txt_mail);
				holder.img_siguiente= (ImageView)convertView
						.findViewById(R.id.btn_agendaSiguiente); 
				convertView.setTag(holder);
			} else {
				holder = (Holder) convertView.getTag();
			}
			
			final Contacto contacto = (Contacto) getItem(position);
			
			holder.txt_contacto.setText(contacto.getNombre());
			
			if (contacto.getTieneFoto()) {
				try {
					java.io.InputStream input;
					input = getContentResolver().openInputStream(contacto.getFoto());
					final Bitmap bm = BitmapFactory.decodeStream(input);
					input.close();
					
					holder.imagen_contacto.setImageBitmap(bm);
				} catch (Exception e) {
					holder.imagen_contacto.setImageDrawable(getResources().getDrawable(R.drawable.contacto));
				}
			} else {
				holder.imagen_contacto.setImageDrawable(getResources().getDrawable(R.drawable.contacto));
			}
			
			holder.imagen_contacto.setMode(ContactsContract.QuickContact.MODE_SMALL);
			
			if(contacto.tieneTelefono()){
				holder.txt_telefono.setVisibility(TextView.VISIBLE);
				holder.txt_telefono.setText(contacto.getTelefonos().get(0));
				holder.imagen_contacto.assignContactFromPhone(contacto.getTelefonos().get(0), true);
			}else{
				holder.txt_telefono.setVisibility(TextView.GONE);
			}
			
			if(contacto.tieneMail()){
				holder.txt_correo.setVisibility(TextView.VISIBLE);
				holder.txt_correo.setText(contacto.getEmails().get(0).getValue());
				holder.imagen_contacto.assignContactFromEmail(contacto.getEmails().get(0).getValue(), true);
			}else{
				holder.txt_correo.setVisibility(TextView.GONE);
			}
			
			holder.img_siguiente.setOnClickListener(new OnClickListener() {
				
				@Override
				public void onClick(View arg0) {
					Intent intent= new Intent(Agenda.this, TabContactoWeb.class);
					intent.putExtra("fotoContacto", contacto.getFoto());
					intent.putExtra("nombreContacto", contacto.getNombre());
					if(contacto.getTelefonos().size() > 0)
						intent.putExtra("telefonoContacto", contacto.getTelefonos().get(0));
					if(contacto.getEmails().size() > 0)
						intent.putExtra("correoContacto", contacto.getEmails().get(0).getValue());
					startActivity(intent);
				}
			});
			
			return convertView;
		}

		@Override
		public Filter getFilter() {
			if (filter == null) {
				filter = new ContactFilter();
			}
			return filter;
		}
	}
	
	@Override
	public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
		contactoSeleccionado = (Contacto) adapter.getItem(position);
		if(nombreUsuario != null){
			showDialog(DIALOG_CONFIRMAR);
		}else
			showDialog(DIALOG_CONTACTO);
	}
	
	@Override
	protected Dialog onCreateDialog(int id) {
		Dialog dialog= null;
		switch(id){
			case DIALOG_ORDENAR:
				dialog= ordenarDialog();
				break;
			case DIALOG_CONTACTO:
				dialog= contactDialog();
				break;
			case DIALOG_CONFIRMAR:
				dialog= confirmDialog();
		}
		
		return dialog;
	}
	
	@Override
	protected void onPrepareDialog(int id, Dialog dialog) {
		if (id == DIALOG_CONTACTO) {
			removeDialog(id);
		}
	}
	
	private Dialog contactDialog(){
		Dialog dialog = new Dialog(this);
		dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
		dialog.setContentView(R.layout.contacto);

		TextView nombreContacto= (TextView) dialog.findViewById(R.id.lbl_nombreContacto);
		nombreContacto.setText(contactoSeleccionado.getNombre());
		
		if(contactoSeleccionado.getTieneFoto()){
			ImageView fotoContacto= (ImageView)dialog.findViewById(R.id.fotoContacto);
			fotoContacto.setImageURI(contactoSeleccionado.getFoto());
		}
		
		Button btnLlamar= (Button) dialog.findViewById(R.id.btn_llamar);
		Button btnMensaje= (Button) dialog.findViewById(R.id.btn_sms);
		Button btnMail= (Button) dialog.findViewById(R.id.btn_mail);

		// Cargo los telefonos del contacto
		if(contactoSeleccionado.getTelefonos().size() > 0){
			cargarSpinnerTelefonos(dialog);
		}else{
			LinearLayout lout_llamadas= (LinearLayout) dialog.findViewById(R.id.layout_llamadas);
			lout_llamadas.setVisibility(LinearLayout.GONE);
			btnLlamar.setVisibility(Button.GONE);
			btnMensaje.setVisibility(Button.GONE);
		}
		
		//Cargo los correos del contacto
		if(contactoSeleccionado.getEmails().size() > 0){
			cargarSpinnerEmails(dialog);
		}else{
			LinearLayout lout_correo= (LinearLayout) dialog.findViewById(R.id.layout_enviarCorreo);
			lout_correo.setVisibility(LinearLayout.GONE);
			btnMail.setVisibility(Button.GONE);
		}
		
		// Agrego las acciones a los botones
		btnLlamar.setOnClickListener(new OnClickListener() {
				
			@Override
			public void onClick(View v) {
				llamarContacto(contactoSeleccionado.getTelefonos().get(posTelSeleccionado));
			}
		});
			
		btnMensaje.setOnClickListener(new OnClickListener() {
				
			@Override
			public void onClick(View v) {
				
				Intent smsIntent = new Intent(Intent.ACTION_VIEW);
				smsIntent.setType("vnd.android-dir/mms-sms");
				smsIntent.putExtra("address", contactoSeleccionado.getTelefonos().get(posTelSeleccionado));
				smsIntent.putExtra("sms_body","");
				startActivity(smsIntent);
	
			}
		});
		
		btnMail.setOnClickListener(new OnClickListener() {
				
			@Override
			public void onClick(View v) {					
				Intent intent= new Intent(Agenda.this, Email.class);
				intent.putExtra("email", contactoSeleccionado.getEmails().get(posEmailSeleccionado).getValue());
				startActivity(intent);
			}
		});
		
		return dialog;
	}
	
	private Dialog ordenarDialog(){ 
		final CharSequence[] items = {"Ascendente", "Descendente", "Favoritos", "Frecuencia"};

		AlertDialog.Builder builder = new AlertDialog.Builder(this);
		builder.setTitle("Ordenar Contactos");
		builder.setSingleChoiceItems(items, -1, new DialogInterface.OnClickListener() {
		    public void onClick(DialogInterface dialog, int item) {
		    	ordenElegido= item;
		    }
		});
		
		builder.setPositiveButton("Aceptar", new DialogInterface.OnClickListener() {		
			@Override
			public void onClick(DialogInterface dialog, int which) {
				// Aca hay que ordenar y guardar la preferencia
		        String order= getOrden(ordenElegido);
		        cargarAgenda(order);
		        
		        // Guardo la preferencia
		        SharedPreferences app_preferences = getSharedPreferences("ordenContactos", MODE_PRIVATE); 
		        SharedPreferences.Editor editor = app_preferences.edit();
		        editor.putString("ordenContactos", order);
		        editor.commit();
		        
		        // Cierro el diálogo
		        dialog.dismiss();
			}
		});
		
		builder.setNegativeButton("Cancelar", new DialogInterface.OnClickListener() {
			
			@Override
			public void onClick(DialogInterface dialog, int which) {
				dialog.dismiss();
			}
		});
		
		AlertDialog alert = builder.create();
		return alert;
	}
	
	private Dialog confirmDialog(){
		AlertDialog.Builder builder = new AlertDialog.Builder(this);
		builder.setTitle("Añadir a contacto");
		builder.setMessage("¿Esta seguro que desea añadir el usuario al contacto?");
		builder.setPositiveButton("Aceptar", new DialogInterface.OnClickListener() {		
			@Override
			public void onClick(DialogInterface dialog, int which) {
				Intent resultIntent = new Intent();
				String id= contactoSeleccionado.getId();
				resultIntent.putExtra("idContacto", id);
				resultIntent.putExtra("nombreContacto", contactoSeleccionado.getNombre());
				setResult(Agenda.RESULT_OK, resultIntent);
				finish();
			}
		});
		
		builder.setNegativeButton("Cancelar", new DialogInterface.OnClickListener() {
			
			@Override
			public void onClick(DialogInterface dialog, int which) {
				dialog.dismiss();
			}
		});
		
		AlertDialog alert = builder.create();
		return alert;
	}
	
	private void cargarSpinnerTelefonos(Dialog dialog){
		Spinner spinnerTelefonos = (Spinner) dialog.findViewById(R.id.sp_telefonos);
		ArrayAdapter<String> arrayadapter = new ArrayAdapter<String>(this,
		            android.R.layout.simple_spinner_item, contactoSeleccionado.getTelefonos());
		arrayadapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
		spinnerTelefonos.setAdapter(arrayadapter);    
		spinnerTelefonos.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
			@Override
		    public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {
		        posTelSeleccionado= position;
		    }

		    @Override
		    public void onNothingSelected(AdapterView<?> parentView) {}
		});
	}
	
	private void cargarSpinnerEmails(Dialog dialog){
		Spinner spinnerEmails = (Spinner) dialog.findViewById(R.id.sp_correo);
		ArrayAdapter<EmailContacto> arrayadapter = new ArrayAdapter<EmailContacto>(this,
		            android.R.layout.simple_spinner_item, contactoSeleccionado.getEmails());
		arrayadapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
		spinnerEmails.setAdapter(arrayadapter);    
		spinnerEmails.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
			@Override
		    public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {
		        posEmailSeleccionado= position;
		    }

		    @Override
		    public void onNothingSelected(AdapterView<?> parentView) {}
		});
	}
	
	public void llamarContacto(String telefono){
		Intent intent = new Intent(Intent.ACTION_CALL);
		intent.setData(Uri.parse("tel:"+contactoSeleccionado.getTelefonos().get(posTelSeleccionado)));
		startActivity(intent);
	}
}